//  测试查看内容


let sqlite3 = require('sqlite3').verbose();
let _ = require('underscore');

// let G = require('./config');

let G = {
    log() {
        console.log.call(console, ...arguments);
    }
};


// G.log('hello world!');
// G.log(1,2,3,4,5);


//
function isArrayOrObjectOrFunction(val) {
    return _.isArray(val) || _.isObject(val) || _.isFunction(val);
}

function getSqlKVArray(obj) {
    let lstSk = [];
    let lstSv = [];

    // 对obj的字段进行检查
    let keys = Object.keys(obj);
    for (let i = 0, len = keys.length; i < len; ++i) {
        let k = keys[i];
        if (isArrayOrObjectOrFunction(obj[k])) {
            throw new Error('obj[k] 是一个 数组 或者 函数 或者对象');
            continue;
        }

        lstSk.push(k);
        lstSv.push(obj[k]);
    }
    return {
        k: lstSk,
        v: lstSv
    };
}

// API
let mydb = {
    db: null,
    sqlArr: [],
    defaultPrimaryKeyId: '_kid',

    // 创建/初始化 数据库
    initDb(dbfile) {
        this.db = new sqlite3.Database(dbfile);
    },

    closeDb() {
        if (this.db) {
            this.db.close();
        }
    },


    dropTable(tableName, cb) {
        this.db.run('drop table ' + tableName, function (err) {
            if (err) {
                throw new Error('mydb error.' + (err.message || err));
            }
            G.log('删除 ' + tableName + ' 成功!');
            if (cb) {
                cb();
            }
        });
    },

// 查
    query(sql, successCb) {
        this.db.all(sql, function (err, rows) {
            if (err) {
                throw new Error('mydb query error.' + (err.message || err));
            }
            if (successCb) {
                successCb(rows);
            }
        });
    },

    buildInsertSql(tableName) {
        this.sqlArr.length = 0;
        this.sqlArr.push('insert into ' + tableName);
        return this;
    },
    values(obj) {

        if (this.sqlArr.length !== 1) {
            throw  new Error('this.sqlArr.length 应该等于 1');
        }

        let kvObj = getSqlKVArray(obj);
        let lstSk = kvObj.k;
        let lstSv = kvObj.v;

        this.sqlArr.push('(');

        for (let i = 0, len = lstSk.length; i < len; ++i) {
            this.sqlArr.push(lstSk[i]);
            if (i !== len - 1) {
                this.sqlArr.push(',');
            } else {
                this.sqlArr.push(')');
            }
        }

        this.sqlArr.push('values');
        this.sqlArr.push('(');

        for (let i = 0, len = lstSv.length; i < len; ++i) {
            if (_.isString(lstSv[i])) {
                this.sqlArr.push('"' + lstSv[i] + '"');
            } else if (_.isNumber(lstSv[i])) {
                this.sqlArr.push(lstSv[i]);
            } else {
                throw new Error('暂时只支持字符串和number类型');
            }

            if (i !== len - 1) {
                this.sqlArr.push(',');
            } else {
                this.sqlArr.push(')');
            }
        }
        return this;
    },


// 构造一个查询语句
    buildQuerySql(tableName) {
        this.sqlArr.length = 0;
        this.sqlArr.push('select * from ' + tableName);
        return this;
    },

// delete语句链式调用,但是不支持嵌套.
    buildDeleteSql(tableName) {
        this.sqlArr.length = 0;
        this.sqlArr.push('delete from ' + tableName);
        return this;
    },


    sql() {
        return this.sqlArr.join(' ');
    },


// 构造一个更新语句
    buildUpdateSql(tableName) {
        this.sqlArr.length = 0;
        this.sqlArr.push('update ' + tableName + ' set');
        return this;
    },

    set(expr) {
        if (this.sqlArr.length > 1) {
            this.sqlArr.push(',');
        }
        this.sqlArr.push(expr);
        return this;
    },

    where(cond) {
        this.sqlArr.push('where');
        this.sqlArr.push(cond);
        return this;
    },


// 构造一条 create 语句
    buildTableSql(tableName) {
        this.sqlArr.length = 0;
        this.sqlArr.push('create table if not exists ' + tableName + '(');
        return this;
    },

// 包含一个主键为 _kid 自动自增的字段
    autoPrimaryKey() {
        if (this.sqlArr.length !== 1) {
            throw  new Error('this.sqlArr.length 应该等于 1');
        }
        this.sqlArr.push(this.defaultPrimaryKeyId + ' integer primary key autoincrement,');
        return this;
    },

// 指定主键
    primaryKey(keyName, keyType) {
        if (this.sqlArr.length !== 1) {
            throw new Error('this.sqlArr.length 应该等于 1');
        }
        this.sqlArr.push(`${keyName} ${keyType} primary key,`);
        return this;
    },

    keys(keyArr) {
        for (let i = 0, len = keyArr.length; i < len; ++i) {
            if (keyArr[i].split(' ').length < 2) {
                throw  new Error('需要为 ' + keyArr[i] + ' 指定数据类型');
            }
            this.sqlArr.push(keyArr[i]);
            if (i !== len - 1) {
                this.sqlArr.push(',');
            }
        }
        this.sqlArr.push(')');
        return this;
    },
};


// 增删改
// 创建table/删除table
mydb.createTable = mydb.insert = mydb.delete = mydb.update = function (sql, cb) {
    this.db.run(sql, function (err) {
        if (err) {
            throw new Error('mydb error.' + (err.message || err));
        }
        G.log('操作成功!');
        if (cb) {
            cb();
        }
    });
};




// const path = require('path');
const dbfile = '/Users/dai/my_file';

mydb.initDb(dbfile);
mydb.query('select * from info',(rows)=>{
    console.log('rows:',rows);
});



module.exports = mydb;
